package ar.com.aterrizar.aerolineas;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.uqbar.commons.model.UserException;
import com.lanchita.AerolineaLanchita;
import com.lanchita.excepciones.*;
import ar.com.aterrizar.aerolineas.Aerolinea;
import ar.com.aterrizar.asientos.Asiento;
import ar.com.aterrizar.asientos.AsientoLanchita;
import ar.com.aterrizar.entidades.Cliente;
import ar.com.aterrizar.entidades.TipoDeClaseAsiento;
import ar.com.aterrizar.entidades.TipoDeUbicacionAsiento;

public class AeroLanchita implements Aerolinea {

	
	private String aerolinea = "lanchita";
	private final AerolineaLanchita lanchita;
	private Collection<Asiento> asientos;
	private Float porcentaje = (float) 1.15;
	private Collection<Asiento> asientosComprados = new ArrayList<Asiento>();
	private List<String[]> asientosLanchita ;
	private static AeroLanchita INSTANCE;
	
	
	public static AeroLanchita getInstance() {
		if (INSTANCE == null) {
			INSTANCE = new AeroLanchita();
		}

		return INSTANCE ;
	}

	
	protected AeroLanchita(){
		this.lanchita = AerolineaLanchita.getInstance();
	}
	
	/**
	 * Solo para test
	 * @param lanchitaMock
	 */
	
	public AeroLanchita(AerolineaLanchita lanchitaMock){
		this.lanchita = lanchitaMock;
	}
	
	
	public Collection<Asiento> getAsiento(String origen, String fechaSalida) {
		
		this.asientos = new ArrayList<Asiento>();
		this.asientosLanchita = new ArrayList<String[]>();
		
		//this.asientosLanchita = Arrays.asList(this.lanchita
		//		.asientosDisponibles(origen, null, fechaSalida, null, null, null));
		this.asientosLanchita = Arrays.asList(this.lanchita.asientos(origen, null, fechaSalida, null, null, null));
		if (this.asientosLanchita == null) {
			return this.asientos = null;
		}
		return formatearLista(this.asientosLanchita);
	}

	
	public Collection<Asiento> getAsiento(String origen, String fechaSalida,
			String destino) {
		
		this.asientos = new ArrayList<Asiento>();
		this.asientosLanchita = new ArrayList<String[]>();
		this.asientosLanchita = Arrays.asList(this.lanchita.asientos(origen, destino, fechaSalida, null, null, null));

		if (this.asientosLanchita == null) {
			return this.asientos = null;
		}
		return formatearLista(this.asientosLanchita);
	}

	
	public Collection<Asiento> getAsiento(String origen, String fechaSalida,
			String horaSalida, String destino, String fechaLlegada,
			String horaLlegada) {
		
		this.asientos = new ArrayList<Asiento>();
		this.asientosLanchita = Arrays.asList(this.lanchita.asientos(origen, destino, fechaSalida, fechaSalida, horaSalida, horaLlegada));

		if (this.asientosLanchita == null) {
			return this.asientos = null;
		}
		return formatearLista(this.asientosLanchita);
	}

	
	public void reservar(Asiento asiento, Cliente cliente) {
	
		try {
			this.lanchita.reservar(asiento.getCodigoDeAsiento(), Integer.toString(cliente.getDni()));
		} catch (EstadoErroneoException e) {
			throw new UserException("Ha ocurrido un error en su reserva <"+ e.getMessage() +"> intente nuevamente");
		}
	}
	
	
	public Boolean estaReservado(Asiento asiento) {
		return false;
	}

	
	public void comprar(Asiento asiento, Cliente cliente)  {
		try {
			this.lanchita.comprar(asiento.getCodigoDeAsiento());
			this.asientosComprados.add(asiento);
		} catch (EstadoErroneoException e) {
			throw new UserException("Ha ocurrido un error en su compra <"+ e.getMessage() +"> intente nuevamente");
		}
	}

	public String getAerolinea(){
		return this.aerolinea;
	}

	
	public Float getPorcentaje() {
		return this.porcentaje;
	}
	
	
	
	private Collection<Asiento> formatearLista(List<String[]> listaSinFormato) {

		

		Collection<Asiento> listaDeAsientos = new ArrayList<Asiento>();

		for (String[] asientoSinFormato : listaSinFormato) {
			
			String fechaSalida = asientoSinFormato[10] + " " + asientoSinFormato[6];
			String fechaLlegada = asientoSinFormato[11] + " " + asientoSinFormato[7];
			
			AsientoLanchita asientoLanchita = new AsientoLanchita(asientoSinFormato[0],
					new Float(asientoSinFormato[1]),
					formatClase(asientoSinFormato[2]),
					formatUbicacion(asientoSinFormato[3]),
					formatDisponibilidad(asientoSinFormato[4]),
					fechaSalida,
					fechaLlegada,asientoSinFormato[8],asientoSinFormato[9]);

			listaDeAsientos.add(asientoLanchita);

		}

		return listaDeAsientos;

	}

	private Boolean formatDisponibilidad(String disponibilidad) {
		return (disponibilidad == "D");
	}

	private TipoDeClaseAsiento formatClase(String clase) {
		if (clase == "P") {
			return TipoDeClaseAsiento.PRIMERACLASE;
		}
		if (clase == "T") {
			return TipoDeClaseAsiento.TURISTA;
		}
		return TipoDeClaseAsiento.EJECUTIVA;
	}

	private TipoDeUbicacionAsiento formatUbicacion(String ubicacion) {
		if (ubicacion == "V") {
			return TipoDeUbicacionAsiento.VENTANA;
		}
		if (ubicacion == "C") {
			return TipoDeUbicacionAsiento.CENTRO;
		}
		return TipoDeUbicacionAsiento.PASILLO;
	}

	
	public Collection<Asiento> vuelosComprados() {
		return asientosComprados;
	}


	public int vuelosComprados(String codigoDeVuelo){
		int cant=0;
		for(Asiento asiento:this.vuelosComprados()){
			if(asiento.getCodVuelo().equals(codigoDeVuelo)){
				cant++;
			}
		}
		return cant;
	}

	
	
}
